#include "Thread.h"
#include"CurrentThread.h"
#include<semaphore.h>

std::atomic_int Thread::numCreated_(0); // =0 这种explicit不能用
Thread::Thread(ThreadFunc func, const std::string &name) // 这里不需要把模板参数也写出来
    : started_(false), joined_(false), tid_(0), func_(std::move(func)), name_(name)
{
    setDefaultName();
}
Thread::~Thread()
{
    if(started_ && !joined_)
    {
        thread_->detach();// thread类提供的设置分离线程的方法
    }
}

void Thread::start() // 一个Thread对象，记录的就是一个新线程的详细信息、
{
  started_ = true;
  sem_t sem;
  sem_init(&sem,false,0);
  // 开启线程，&获取外部成员变量
  thread_ = std::shared_ptr<std::thread>(new std::thread([&](){
    // 获取线程的tid值
    tid_ = CurrentThread::tid();
    sem_post(&sem);
    // 开启一个新线程
    func_(); // 开启一个新线程，专门执行该线程函数
  }));  

  // 等待新创建线程的tid值
  sem_wait(&sem);
}
void Thread::join()
{
    joined_ = true;
    thread_->join();
}

void Thread::setDefaultName()
{
    int num = ++numCreated_;
    if(name_.empty())
    {
        char buf[32] = {0};
        snprintf(buf,sizeof buf,"Thread%d",num);
        name_ = buf;
    }
}
